#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time   : 2022-06-06 17:51:04
# @Author : 搬砖客
"""
mysql 封装，支持 增、删、改、查
"""

import pymysql
from pymysql.cursors import DictCursor
from utils.process_files_utils.yaml_util import YamlUtil
from utils.logging_utils.log_util import write_log, write_warning_log
from typing import Text
from warnings import filterwarnings

# 忽略 Mysql 告警信息
filterwarnings("ignore", category=pymysql.Warning)


# 数据返回为空的时候，反回了None，这个时候要先判断是否为空，才能进行元祖下标或者字典key取值
# todo 数据库读取的时候，支持选择数据库
class Database:
    def __init__(self):
        try:
            host = YamlUtil.read_config_yaml('mysql', 'host')
            user = YamlUtil.read_config_yaml('mysql', 'user')
            password = YamlUtil.read_config_yaml('mysql', 'password')
            database = YamlUtil.read_config_yaml('mysql', 'database')
            write_log(f"进行数据库连接，host为：'{host}'，user为：{user}")
            self.conn = pymysql.connect(host=host, user=user, password=password, database=database,
                                        charset='utf8')
            # 创建一个默认的游标类型（返回二维元组）
            # self.cursor = self.conn.cursor()
            # 创建一个默认的游标类型（返回字典类型）
            self.cursor = self.conn.cursor(DictCursor)
        except AttributeError as e:
            write_warning_log("数据库连接失败，失败原因{0}".format(e))

    def __del__(self):
        try:
            # 关闭游标
            self.cursor.close()
            # 断开连接
            self.conn.close()
            write_log("数据库连接关闭成功")
        except AttributeError as e:
            write_warning_log("数据库连接失败，失败原因{0}".format(e))

    def query_sql(self, sql: Text, state="all") -> Text:
        """
        查询
        :param sql:
        :param state: all默认查询全部数据
        :return: 返回sql查询内容，格式为字符串
        """
        try:
            self.cursor.execute(sql)
            if state == "all":
                # 查询全部数据,返回字符串，通过in断言（这个后面看看可不可以灵活点，先凑活用）
                data = str(self.cursor.fetchall())
            else:
                # 查询单条
                data = str(self.cursor.fetchone())
            return data
        except AttributeError as e:
            write_warning_log("数据库连接失败，失败原因{0}".format(e))

    def execute(self, sql: Text):
        """
            更新 、 删除、 新增
            :param sql:
            :return:
            """
        try:
            # 使用 execute 操作 sql
            rows = self.cursor.execute(sql)
            # 提交事务
            self.conn.commit()
            return rows
        except AttributeError as e:
            # 如果事务异常，则回滚数据
            self.conn.rollback()
            write_warning_log("数据库连接失败，失败原因{0}".format(e))

    # 将返回的元祖转换为字符串格式，用于断言
    def query_one_str(self, sql):
        self.cursor.execute(sql)

        result = str(self.cursor.fetchone())
        return result

    # 返回的元祖,用下标取值
    def query_one_dict(self, sql):
        self.cursor.execute(sql)
        result = self.cursor.fetchone()
        return result

    def query_all_str(self, sql):
        self.cursor.execute(sql)
        result = str(self.cursor.fetchall())
        return result

    def query_all_tuple(self, sql):
        self.cursor.execute(sql)
        result = self.cursor.fetchall()
        return result
